"use strict";
"object" != typeof window.CP && (window.CP = {}), window.CP.PenTimer = {
    programNoLongerBeingMonitored: !1,
    timeOfFirstCallToShouldStopLoop: 0,
    _loopExits: {},
    _loopTimers: {},
    START_MONITORING_AFTER: 2e3,
    STOP_ALL_MONITORING_TIMEOUT: 5e3,
    MAX_TIME_IN_LOOP_WO_EXIT: 2200,
    exitedLoop: function (o) {
        this._loopExits[o] = !0
    },
    shouldStopLoop: function (o) {
        if (this.programKilledSoStopMonitoring)return !0;
        if (this.programNoLongerBeingMonitored)return !1;
        if (this._loopExits[o])return !1;
        var t = this._getTime();
        if (0 === this.timeOfFirstCallToShouldStopLoop)return this.timeOfFirstCallToShouldStopLoop = t, !1;
        var i = t - this.timeOfFirstCallToShouldStopLoop;
        if (i < this.START_MONITORING_AFTER)return !1;
        if (i > this.STOP_ALL_MONITORING_TIMEOUT)return this.programNoLongerBeingMonitored = !0, !1;
        try {
            this._checkOnInfiniteLoop(o, t)
        } catch (n) {
            return this._sendErrorMessageToEditor(), this.programKilledSoStopMonitoring = !0, !0
        }
        return !1
    },
    _sendErrorMessageToEditor: function () {
        try {
            if (this._shouldPostMessage()) {
                var o = {action: "infinite-loop", line: this._findAroundLineNumber()};
                parent.postMessage(JSON.stringify(o), "*")
            } else this._throwAnErrorToStopPen()
        } catch (t) {
            this._throwAnErrorToStopPen()
        }
    },
    _shouldPostMessage: function () {
        return document.location.href.match(/boomerang/)
    },
    _throwAnErrorToStopPen: function () {
        throw"We found an infinite loop in your Pen. We've stopped the Pen from running. Please correct it or contact support@codepen.io."
    },
    _findAroundLineNumber: function () {
        var o = new Error, t = 0;
        if (o.stack) {
            var i = o.stack.match(/boomerang\S+:(\d+):\d+/);
            i && (t = i[1])
        }
        return t
    },
    _checkOnInfiniteLoop: function (o, t) {
        if (!this._loopTimers[o])return this._loopTimers[o] = t, !1;
        var i = t - this._loopTimers[o];
        if (i > this.MAX_TIME_IN_LOOP_WO_EXIT)throw"Infinite Loop found on loop: " + o
    },
    _getTime: function () {
        return +new Date
    }
}, window.CP.shouldStopExecution = function (o) {
    return window.CP.PenTimer.shouldStopLoop(o)
}, window.CP.exitedLoop = function (o) {
    window.CP.PenTimer.exitedLoop(o)
};